|
(******************************************************************************)
(**) ОТДЕЛ КрНолики+;
(******************************************************************************)
(* НАЗНАЧЕНИЕ: пример игры "Крестики-нолики". *)
(* ПРИМЕЧАНИЯ: для управления можно использовать только мышку, *)
(* правила игры см. в отделе \Глагол\Приложения\Игры\КрНолики\Игра.отд *)
(******************************************************************************)
ИСПОЛЬЗУЕТ
Игра ИЗ ".\КрНолики\", (* алгоритм игры *)
Ввод ИЗ "...\Отделы\Обмен\",
Вывод ИЗ "...\Отделы\Обмен\",
Окно ИЗ "...\Отделы\Обмен\",
Поле ИЗ "...\Отделы\Поле\",
Надел ИЗ "...\Отделы\Поле\",
Подложка ИЗ "...\Отделы\Поле\",
Записка ИЗ "...\Отделы\Поле\",
Кнопка ИЗ "...\Отделы\Поле\";
ПОСТ (* действия *)
дЗаново=1;
дВыход =2;
ПЕР
записка:Записка.Доступ; (* сообщение от машины *)
(******************************************************************************)
ЗАДАЧА РисоватьПозицию;
(* Цель: прорисовка на экране всей позиции игры
* До: <Игра.позиция> - позиция со значками ('+' и 'о')
* Прим: каждая клетка занимает два знакоместа в ширину *)
ПЕР
x,y:ЦЕЛ; (* координаты клетки в позиции *)
к,с:ЦЕЛ; (* экранные координаты клетки *)
зн:ЗНАК; (* значок *)
рисунок:ЦЕПЬ[3]; (* знаки, изображающие значок *)
УКАЗ
Окно.Цвет(1,1,3,3*2,0FX);
ОТ y:=0 ДО 2 ВЫП
ОТ x:=0 ДО 2 ВЫП
зн:=Игра.позиция[y*3+x];
ЕСЛИ зн = " " ТО рисунок:=" "
АЕСЛИ зн = "+" ТО рисунок:="><"
АЕСЛИ зн = "о" ТО рисунок:="()"
КОН;
к:=1+x*2;
с:=1+y*1;
Окно.Цепь(с,к,с,к+1,рисунок)
КОН
КОН
КОН РисоватьПозицию;
(******************************************************************************)
ЗАДАЧА НачатьЗаново;
(* Цель: подготовиться к новой игре *)
УКАЗ
Игра.НачатьЗаново;
Записка.Изменить(записка,"");
РисоватьПозицию
КОН НачатьЗаново;
(******************************************************************************)
ЗАДАЧА МышкаВКлетку(x,y:ЦЕЛ);
(* Цель: сообразить, что делать, если человек загнал мышку в эту клетку
* До: ,y> - координаты клетки *)
ПЕР
n:ЦЕЛ; (* номер клетки в позиции *)
УКАЗ
ЕСЛИ (x < 0) ИЛИ (x > 2) ИЛИ (y < 0) ИЛИ (y > 2) ТО
Записка.Изменить(записка,"мимо");
ВОЗВРАТ
КОН;
ЕСЛИ Игра.Окончена() ТО
ВОЗВРАТ
КОН;
n:=y*3+x;
ЕСЛИ Игра.позиция[n] # " " ТО
Записка.Изменить(записка,"занято");
ВОЗВРАТ
КОН;
Игра.Ход(n);
ЕСЛИ Игра.Окончена() ТО
Записка.Изменить(записка,"Конец!")
ИНАЧЕ
Записка.Изменить(записка,"");
КОН;
РисоватьПозицию
КОН МышкаВКлетку;
(******************************************************************************)
ЗАДАЧА Приём(поле:Поле.Доступ; посылка+:Ввод.Посылка);
(* получить и обработать управляющие послания *)
УКАЗ
ДЛЯ посылка ВИДА
| Ввод.ОтКлавиш:
ЕСЛИ посылка.упрАльт И (посылка.код = 58H) (* Alt+'X' *)
ИЛИ
(посылка.код = 1BH) (* Esc *)
ТО
поле.состояние:=дВыход;
посылка.код:=0
КОН
| Ввод.ОтМышки:
ЕСЛИ (посылка.события = {}) И (посылка.кнопки # {})
ТО
(* нажали кнопку мышки *)
МышкаВКлетку((посылка.к-1) ДЕЛИТЬ 2,посылка.с-1)
КОН
| Кнопка.Посылка:
ВЫБРАТЬ посылка.кнопка.действие ИЗ
дЗаново: НачатьЗаново
| дВыход: поле.состояние:=дВыход
КОН
ИНАЧЕ
КОН
КОН Приём;
(******************************************************************************)
ЗАДАЧА СоздатьПоле():Поле.Доступ;
(* создает рабочее поле экрана *)
ПЕР
кнВыход,кнЗаново:Кнопка.Доступ; (* экранные кнопки *)
поле:Поле.Доступ; (* рабочее поле экрана *)
подложка:Подложка.Доступ; (* подложка поля *)
УКАЗ
(* создаём поле *)
поле:=Поле.Создать(0,0,5,19,ПУСТО,ОТКЛ,Приём);
(* создаём наделы *)
подложка:=Подложка.Создать(0,0,0,0,"");
записка:=Записка.Создать(1,8,1,10,"");
кнЗаново:=Кнопка.Создать(2,8,"[ ~Заново ]",дЗаново,ВКЛ);
кнВыход :=Кнопка.Создать(3,8,"[ ~Выход ]",дВыход,ВКЛ);
(* добавляем наделы в порядке отрисовки и получения ввода *)
Поле.ДобавитьНадел(поле,подложка);
Поле.ДобавитьНадел(поле,записка);
Поле.ДобавитьНадел(поле,кнЗаново);
Поле.ДобавитьНадел(поле,кнВыход);
ВОЗВРАТ поле
КОН СоздатьПоле;
(******************************************************************************)
ЗАДАЧА Поехали;
ПЕР
поле:Поле.Доступ;
УКАЗ
Окно.Графическое("Крестики-нолики","Lucida Console",24,ПУСТО);
(*
Окно.Текстовое(ПУСТО);
*)
поле:=СоздатьПоле();
Поле.ОкноНаВсёПоле(поле);
Поле.Рисовать(поле);
Окно.Показать;
НачатьЗаново;
ПОВТОРЯТЬ
Поле.Проверить(поле)
ДО поле.состояние # Поле.сРабота
КОН Поехали;
(******************************************************************************)
УКАЗ
Поехали
КОН КрНолики.
▲ Вопросы , замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
|
|